package Busquedas;

import Problemas.Problema;
import java.util.ArrayList;

/**
 * Clase para implementar la b�squeda de primero en anchura.
 * Extiende de la clase B�squeda.
 
 */
public class PrimeroAnchura extends Busqueda {
	
	
	/**
	 * Constructor de la b�squeda. Llama a la constructora de B�squeda, su clase padre.
	 * @param p Problema que queremos resolver con la b�squeda A*.
	 */
	public PrimeroAnchura(Problema p){
		super(p);
	}
	
	
	/* (non-Javadoc)
	 * @see Busqueda#buscar(boolean)
	 */
	public ArrayList<Estado> buscar(boolean controlCiclos){
		abiertos.add(this.getNodo()); //se a�ade la ra�z
		expandidos.add(this.getNodo().getEstado());
		Nodo n;
		
		long tiempo1=System.currentTimeMillis();
		try{
			while(!abiertos.isEmpty()){
				n = abiertos.remove(0);
				contadorNodos++;
				if (contadorNodos>maxContadorNodos) return null;
				//this.dibujaNodos(0,n,n.getEstado());
				if (!this.getProblema().estadoFinal(n.getEstado())){
					
					for (int op = 0; op < this.getProblema().getnumOper(); op++){
						
						//this.dibujaNodos(op,n,n.getEstado());
					
						if (n.getOperadoresAplicados()[op]!=1){
							Estado e=this.getProblema().aplicaOperador(n.getEstado(), op);
//							this.dibujaNodos(op,n,e);
							n.setOperadoresAplicados(op);
							
							if (e!=null){
								if (!(controlCiclos && estaEnExpandidos(e))){
									Nodo n2=n.anadeHijo(op,e,this.getProblema().getCosteOperador(op));
									
									abiertos.add(n2);
									expandidos.add(n2.getEstado());
									int inverso = this.getProblema().getOperadorInverso(op);
									if (inverso != -1) 
										n2.setOperadoresAplicados(inverso);
								}
							}
						}
					}	
					
				}else{
					long tiempo2=System.currentTimeMillis();
					this.setTiempoTotal((tiempo2-tiempo1));
					generaCamino(n);				
					return camino;
				}
			}
		}catch(OutOfMemoryError e){
			System.out.println(abiertos.size());
			abiertos = null;
			return null;
		}
		return null;
	}
	
	
	
	
	
}
